/**
 * $version:  0.1 
 * $Date: 2011-01-21 
 *
 * Copyright (C) 2010-2011 Jawa Software. All rights reserved.
 *
 */
package org.jawa.admin;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.jawa.menu.Menu;


/**
 * 菜单组件。
 * 
 * @author Y-N
 * 
 */
public class MenuComponent extends Menu implements Serializable {
	private static final long serialVersionUID = 8157526994257989747L;

	// 下级菜单
	protected List<MenuComponent> menuComponents = Collections
			.synchronizedList(new ArrayList<MenuComponent>());

	// 上级菜单
	protected MenuComponent parentMenu;

	// 是否是最后一个
	private boolean last;

	/**
	 * 向当前菜单组件增加一个下级菜单。
	 * 
	 * @param menuComponent
	 *            菜单组件
	 */
	public void addMenuComponent(MenuComponent menuComponent) {
		if (null == menuComponent || null == menuComponent.getMenuId()) {
			// menuComponent.setMenuname(menuComponents.size() + "");
			return;
		}

		if (!menuComponents.contains(menuComponent)) {
			menuComponents.add(menuComponent);
			menuComponent.setParent(this);
		}
	}

	/**
	 * 向当前菜单组件增加多个下级菜单。
	 * 
	 * @param menuComponents
	 *            菜单组件
	 */
	public void addMenuComponents(MenuComponent[] menuComponents) {
		for (int i = 0; i < menuComponents.length; i++) {
			MenuComponent component = menuComponents[i];
			addMenuComponent(component);
		}
	}

	/**
	 * 返回当前菜单组件的所有下级菜单组件。
	 * 
	 * @return 当前菜单组件的所有下级菜单组件
	 */
	public MenuComponent[] getMenuComponents() {
		return (MenuComponent[]) menuComponents
				.toArray(new MenuComponent[menuComponents.size()]);
	}

	/**
	 * 将当前菜单给件的父菜设置为给定的菜单组件。
	 * 
	 * @param parentMenu
	 *            父菜单组件
	 */
	public void setParent(MenuComponent parentMenu) {
		if (parentMenu != null) {
			if (!parentMenu.getComponents().contains(this)) {
				parentMenu.addMenuComponent(this);
			}
		}
		this.parentMenu = parentMenu;
	}

	/**
	 * 返回当前菜单组件的父菜单组件。
	 * 
	 * @return 当前菜单组件的父菜单组件
	 */
	public MenuComponent getParent() {
		return parentMenu;
	}

	/**
	 * 获取当前菜单组件的下级菜单。
	 * 
	 * @return 当前菜单组件的下级菜单
	 */
	public List getComponents() {
		return menuComponents;
	}

	/**
	 * 获取当前菜单的深度。
	 * 
	 * @return 当前菜单的深度
	 */
	public int getMenuDepth() {
		return getMenuDepth(this, 0);
	}

	private int getMenuDepth(MenuComponent menu, int currentDepth) {
		int depth = currentDepth + 1;

		MenuComponent[] subMenus = menu.getMenuComponents();
		if (subMenus != null) {
			for (int a = 0; a < subMenus.length; a++) {
				int depthx = getMenuDepth(subMenus[a], currentDepth + 1);
				if (depth < depthx)
					depth = depthx;
			}
		}

		return depth;
	}

	/**
	 * 是否是取后一个菜单项。
	 * 
	 * @return 是否是最后一个菜单项
	 */
	public boolean isLast() {
		return last;
	}

	/**
	 * 设置是否是最后一个菜单项。
	 * 
	 * @param last
	 *            是否是最后一个菜单项
	 */
	public void setLast(boolean last) {
		this.last = last;
	}

	/**
	 * 移除当前菜单组件的所有下级菜单。
	 */
	public void removeChildren() {
		for (Iterator iterator = this.getComponents().iterator(); iterator
				.hasNext();) {
			MenuComponent child = (MenuComponent) iterator.next();
			child.setParent(null);
			iterator.remove();
		}
	}

	/**
	 * 比较方法。
	 */
	public boolean equals(Object o) {
		if (!(o instanceof MenuComponent)) {
			return false;
		}
		if (null == o) {
			return false;
		}
		MenuComponent m = (MenuComponent) o;
		return m.getMenuId() == this.getMenuId();
	}

	public String toString() {
		return "菜单编码: " + this.getMenuId();
	}
}
